package com.hy.study.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author huyong
 * @date 2024 年 01 月 08 日 15:47: 47
 *
 * HandlerInterceptor的场景：
 * 鉴权，可以使用HandlerInterceptor但是Filter是更佳的选择。
 * 审计日志，记录每一个请求。
 * Token解析或校验。
 * Handler执行时间统计。
 */
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
    // 在HandlerMapping确定使用哪个Handler处理请求之后，HandlerAdapter调用Handler之前，在该阶段HandlerInterceptor可以修改Request和Response。
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("--------------preHandle-----------------------");
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    // 在HandlerAdapter调用Handler之后，DispatcherServlet渲染视图之前。实际上在调用postHandler之前HandlerAdapter已经完成Response写并提交，因此postHandler无法修改Response。如果有修改Response的场景，可以使用ResponseBodyAdvice接口。
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("--------------postHandle-----------------------");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    //请求处理完成之后调用，适合做一些资源清理工作。
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("--------------afterCompletion-----------------------");
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
